package com.xbtop.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * @author Mxb
 * @version 1.0
 * @date 2020/6/21 10:28
 */
//配置类，相当于xml配置文件作用
@Configuration
@EnableWebSecurity //启用权限框架 声明式配置
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    //实验4： 登录认证
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //默认认证
        //super.configure(auth);
        // 基于内存的认证方式
        auth.inMemoryAuthentication()
                .withUser("zhangsan").password("123").roles("学徒")
                .and()
                .withUser("lisi").password("123").authorities("罗汉去哪", "武当");
    }

    // 设置密码匹配器
    @Bean
    public PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

    /**
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //super.configure(http); //默认规则 拦截所有资源
        //实验1
        //授权放行首页 和静态资源
        //http.authorizeRequests().antMatchers("/layui/**", "/index.jsp").permitAll()
        //        .anyRequest().authenticated(); //剩余任何资源必须认证

        // 实验6
        http.authorizeRequests()
                .antMatchers("/layui/**", "/index.jsp").permitAll()
                .antMatchers("/level1/**").hasRole("学徒")
                .antMatchers("/level2/**").hasRole("大师")
                .antMatchers("/level3/**").hasRole("宗师")
                .anyRequest().authenticated(); //剩余任何资源必须认证

        //
        //实验2：默认及自定义 登录页
        //http.formLogin(); // 默认登录页
        //自定义登录页
        http.formLogin().loginPage("/index.jsp")
                //.usernameParameter("loginacct").passwordParameter("userpswd") //参数名不相等时 设置
                .loginProcessingUrl("/login") // 往哪个路径提交 默认的话就不用写 /login
                .defaultSuccessUrl("/main");  //登录成功去哪里

        //http.csrf().disable();  //禁用csrf
        //实验3：

        //实验4：


        //实验5：用户注销完成
        http.logout()  //默认注销功能
                .logoutUrl("/logout") //退出系统需要发送的请求
                .logoutSuccessUrl("/login")  //退出系统成功以后要跳转的页面地址
                .invalidateHttpSession(true); //session失效（DEBUG）

        //实验6：

        //实验7：
        http.exceptionHandling()
                .accessDeniedPage("/unauth");

        // 开启记住我功能
        http.rememberMe();
    }

}
